package cn.tannn.tgateway;

import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.List;

/**
 * 默认的 公共 chain 实现方法， 将所有的 plugin 串联起来
 *
 * @author <a href="https://t.tannn.cn/">tnnn</a>
 * @version V1.0
 * @date 2024/5/30 下午11:12
 */
public class DefaultGatewayPluginChain implements GatewayPluginChain{

    List<GatewayPlugin> plugins;

    /**
     * 标记当前执行的插件索引, 打断 plugins 的执行
     */
    int index = 0;

    public DefaultGatewayPluginChain(List<GatewayPlugin> plugins) {
        this.plugins = plugins;
    }

    @Override
    public Mono<Void> handle(ServerWebExchange exchange) {
        return Mono.defer( () -> {
            // 打断 plugins 的执行
            if (index < plugins.size()) {
                // index > plugins 所有又plugins 被打断了，需要中断后续的执行
                return plugins.get(index++).handle(exchange, this);
            }
            return Mono.empty();
        });
    }
}
